ROS2 logging
Table of Content
ROS2 logging#
ROS2 logging control and config
config#
environment variables#
- RCUTILS_COLORIZED_OUTPUT
- ROS_LOG_DIR
- RCUTILS_LOGGING_USE_STDOUT
- RCUTILS_LOGGING_BUFFERED_STREAM
- RCUTILS_CONSOLE_OUTPUT_FORMAT
RCUTILS_CONSOLE_OUTPUT_FORMAT#
export RCUTILS_CONSOLE_OUTPUT_FORMAT="[{severity} {time}] [{name}]: {message} ({function_name}() at {file_name}:{line_number})"
RCUTILS_COLORIZED_OUTPUT#
colorize logging
Add environment variable to .bashrc
export RCUTILS_COLORIZED_OUTPUT=1
Control#
throttled#
throttled
node.get_logger().error("log every sec", throttle_duration_sec=1)
one time#
log only first time
node.get_logger().info(f'log only once', once=True)
skip#
log, skip first time
node.get_logger().info(f'log only once', skip_first=True)
logging control demo#
- control node log level
- Set logging format
very simple node with logging
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
class MyNode(Node):
def __init__(self):
node_name="minimal"
super().__init__(node_name)
self.get_logger().info("debug")
self.get_logger().info("info")
self.get_logger().warning("warning")
self.get_logger().error("error")
def main(args=None):
rclpy.init(args=args)
node = MyNode()
rclpy.spin(node)
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
node.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import SetEnvironmentVariable
def generate_launch_description():
log_format_env = SetEnvironmentVariable(name="RCUTILS_CONSOLE_OUTPUT_FORMAT", value="[{severity} {time}] [{name} ({line_number})]: {message} ")
node = Node(name="minimal_node",
package="pkg_launch_tutorial",
executable="minimal_node.py",
arguments=['--ros-args', '--log-level', 'info']
)
ld = LaunchDescription()
ld.add_action(log_format_env)
ld.add_action(node)
return ld
log external config
ros2 run some_package some_ros_executable --ros-args --log-config-file some_log.config
for know spdlog not support external config